#include<graphics.h>
#include<conio.h> 
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment (lib,"Winmm.lib")
/*drop keys：利用小方块和按键的放置舍弃禁用来控制机关，最后达到过关目的的益智型游戏
wasd进行移动，旗帜为目的地，小旗升起到达目的地即为过关
操作方法：
wasd移动
space+wasd=放下方向键，放置后该方向键禁用，一格地图只能放一个方向键，在放置的方向键上按下空格后再按下该方向键可以回收
r键重开该关卡，b键回到选关界面


运用二维数组来使得判定输出和代码编写修改更加容易*/
/*前y后x
小方块和按钮的图片输出在条件设置数组之后*/
int i,j,step=50;//step为一格地图大小用于位移判断
int win=0;//过关时变化
int player[10][10];//小方块和按钮图片输出数组
/*每次移动大小step=50
   原值都为0，即无物
   数组值为1时，小方块图片
   数组值为2时，按钮
   3为按钮和方块*/
int judge;//用于传送阵
int condit[10][10];//其他条件设置数组
/*每个step50
   1是未升起小旗，2为升起小旗
   3为关上小门，4为打开小门
   5为未按下按钮，6为按下的按钮
   7为遮住的墙，8为未遮住的墙
   11为关上的竖着的门，12为不关上的竖着的门
   n为传送阵1号（1），n+1为传送阵1号（2）
   传送阵以此类推
*/
//函数外全局变量定义 
//定义背景，方向键,方块
int key[10][10];//回收按键所使用的二维数组地图变量
/*
1为w
2为s
3为a
4为d*/
IMAGE img_bk,img_direction_a,img_direction_w,img_direction_s,img_direction_d,img_flag;//各类方向
IMAGE img_final_flag; //最后的旗子
IMAGE img_block;//小方块
IMAGE img_wall1,img_wall2;//两种墙的图案
IMAGE img_button1,img_button2;//按下和没按下的按钮
IMAGE img_transport;
IMAGE img_door1open,img_door1close,img_door2open,img_door2close;
IMAGE img_open0,img_open;//开场和选关画面
IMAGE img_mouse;//鼠标移动小东西
IMAGE img_rank1,img_rank2,img_rank3,img_rank4,img_rank5,img_rank6,img_rank7,img_ranklast;//每关画面
IMAGE img_rank1button,img_rank2button,img_rank3button,img_rank4button,img_rank5button,img_rank6button,img_rank7button;//选关按钮移动按下
int block_x,block_y;//方块位置
int plx,ply;//方块xy数组值
int w_x,w_y,a_x,a_y,s_x,s_y,d_x,d_y;// 方向键位置
int flag_x,flag_y;  //旗子位置,非数组版
int block_i=0;//方块移动特效变量
int rabbit_x=0,rabbit_y=0;// 鼠标移动图形变量
int returnw, returna, returns, returnd;  //判断方向键是否在按钮上
int choose=2;//控制选关 0为输出选关 1为不输出 2为输出开幕
int rank=0;//控制关卡出现
int rankbutton=0;//关卡按下控制变量
void  startup()//数据初始化 ,位于每一关前面
{	
	mciSendString("open .//music/background.mp3 alias bkmusic",NULL,0,NULL);//背景音乐
	mciSendString("play bkmusic repeat",NULL,0,NULL);// 循环播放	
	initgraph(800,600);
	//读取图片
	loadimage(&img_bk,".//images/真实的地板无注释版.PNG");   //背景
	loadimage(&img_block,".//images/方块连续图.PNG");   //方块
	loadimage(&img_direction_w,".//images/完成W1.0.PNG");  //方向键w
	loadimage(&img_direction_a,".//images/完成A1.0.PNG");  //方向键a
	loadimage(&img_direction_s,".//images/完成S1.0.PNG");  //方向键s
	loadimage(&img_direction_d,".//images/完成D1.0.PNG");  //方向键d
	loadimage(&img_flag,".//images/旗子目的地1.0.PNG");	 //旗子	
	loadimage(&img_final_flag,".//images/升起的旗子目的地1.0.PNG");	 //升起旗子	
	loadimage(&img_wall1,".//images/遮住的墙.PNG");          //遮住的墙  7 
    loadimage(&img_wall2,".//images/墙.PNG");             //墙8
	loadimage(&img_button1,".//images/无背景按钮（未按下）1.0.PNG");          //未按下的按钮 
	loadimage(&img_button2,".//images/无背景按钮（按下）1.0.PNG");          //按下的按钮
	loadimage(&img_transport,".//images/传送阵.PNG");        // 传送阵
	loadimage(&img_door1open,".//images/栏打开1.0.PNG");     //门打开
	loadimage(&img_door1close,".//images/栏杆关上1.0.PNG");     //门关上
	loadimage(&img_door2open,".//images/竖着打开的栏杆.PNG");     //门打开12
	loadimage(&img_door2close,".//images/竖着的关上的栏杆.PNG");     //门关上11
	loadimage(&img_open0,".//images/选关.PNG");     //选关
	loadimage(&img_open,".//images/开幕.PNG");     //开幕
	loadimage(&img_mouse,".//images/鼠标.PNG");     //鼠标移动
	loadimage(&img_rank1,".//images/第一关开场.PNG");     //第一关开场
	loadimage(&img_rank2,".//images/第二关开场.PNG");     //第二关开场
	loadimage(&img_rank3,".//images/第三关开场.PNG");     //第三关开场
	loadimage(&img_rank4,".//images/第四关开场.PNG");     //第四关开场
	loadimage(&img_rank5,".//images/第五关开场.PNG");     //第五关开场
	loadimage(&img_rank6,".//images/第六关开场.PNG");     //第六关开场
	loadimage(&img_rank7,".//images/第七关开场.PNG");     //第七关开场
	loadimage(&img_ranklast,".//images/end.PNG");     //最后开场
	loadimage(&img_rank1button,".//images/1按下.PNG");     //第一关按钮
	loadimage(&img_rank2button,".//images/2按下.PNG");     //第二关按钮
	loadimage(&img_rank3button,".//images/3按下.PNG");     //第三关按钮
	loadimage(&img_rank4button,".//images/4按下.PNG");     //第四关按钮
	loadimage(&img_rank5button,".//images/5按下.PNG");     //第五关按钮
	loadimage(&img_rank6button,".//images/6按下.PNG");     //第六关按钮
	loadimage(&img_rank7button,".//images/7按下.PNG");     //第七关按钮
	for(i=0;i<10;i++)//condit所有清零,player清零
	{
		for(j=0;j<10;j++)
		{
			condit[i][j]=0;
		    player[i][j]=0;
			key[i][j]=0;
		}
	}
	// 地图外各方向键位置以及禁用变量的改变
	w_x=650;
	w_y=100; 
	returnw=1;
	a_x=600;
	a_y=150;
	returna=1;
	s_x=650;
	s_y=200;
	returns=1;
	d_x=700;
	d_y=150;
	returnd=1;
	
	judge=1;//传送阵初始判定
}

void music_win()//过关音效
{
	mciSendString("close jpmusic",NULL,0,NULL); //先把前面一次的音乐关闭
	mciSendString("open .//music/过关.mp3 alias jpmusic",NULL,0,NULL);//打开音效
	mciSendString("play jpmusic",NULL,0,NULL);//仅播放一次
}
void music_brickmove()//方块移动音效
{
	mciSendString("close jpmusic",NULL,0,NULL); //先把前面一次的音乐关闭
	mciSendString("open .//music/方块移动.mp3 alias jpmusic",NULL,0,NULL);//打开弹跳音效
	mciSendString("play jpmusic",NULL,0,NULL);//仅播放一次
}
void music_buttondrop()//方块移动音效
{
	mciSendString("close jpmusic",NULL,0,NULL); //先把前面一次的音乐关闭
	mciSendString("open .//music/放按钮音效.mp3 alias jpmusic",NULL,0,NULL);//打开弹跳音效
	mciSendString("play jpmusic",NULL,0,NULL);//仅播放一次
}
void blockContiune()//方块移动动画
{
	block_i=0;
	block_i++;
	putimage(block_x,block_y,28,40,&img_block,28*block_i+2,0); // 方块
	FlushBatchDraw();
	Sleep(1);//稍微停一下
	if(block_i==4)
		block_i=0;
}
void show()      //显示画面 
{	
	putimage(0,0,&img_bk);// 在坐标（0,0）处显示background
	for(i=0;i<10;i++)//全场巡逻式放图
	{
		for(j=0;j<10;j++)
		{
			//按钮
			if(condit[i][j]==5)//没有按下的按钮
				putimage(25+j*50,75+i*50,&img_button1); 
	    	else if(condit[i][j]==6)//按下的按钮
				putimage(25+j*50,75+i*50,&img_button2);
			//小旗
			else if(condit[i][j]==1)
			{
                putimage(27+j*50,78+i*50,&img_flag);   //旗子   
			}
			else if(condit[i][j]==2)
			{
				putimage(27+j*50,78+i*50,&img_final_flag);   //升起的旗子
			}
			else if(condit[i][j]==9)
			{
				putimage(27+j*50,78+i*50,&img_transport);   //传送阵
			}
			//栏杆
			else if(condit[i][j]==3)
			{
				putimage(25+j*50,83+i*50,&img_door1close);   //关上的门
			}
			else if(condit[i][j]==4)
			{
				putimage(25+j*50,83+i*50,&img_door1open);   //打开的门
			}
			
			else if(condit[i][j]==11)
			{
				putimage(45+j*50,75+i*50,&img_door2close);   //关上的门
			}
			else if(condit[i][j]==12)
			{
				putimage(45+j*50,75+i*50,&img_door2open);   //打开的门
			}
		}
	}
	putimage(w_x,w_y,&img_direction_w);  // 方向键w
	putimage(a_x,a_y,&img_direction_a);  //方向键a
	putimage(s_x,s_y,&img_direction_s);  //方向键s
	putimage(d_x,d_y,&img_direction_d);  //方向键d
	putimage(block_x,block_y,28,40,&img_block,0,0); // 方块	
	for(i=0;i<10;i++)//全场巡逻式放图
	{
		for(j=0;j<10;j++)
		{
			//围墙
			if(condit[i][j]==7)//被遮住的围墙
				putimage(25+j*50,55+i*50,&img_wall1);
			else if(condit[i][j]==8)//没有被遮住的围墙
				putimage(25+j*50,55+i*50,&img_wall2);
		}
	}
	if(choose==0)//选关
	{
		clearrectangle(0,0,800,600);//清空矩形区域
		putimage(0,0,&img_open0);  // 选关
		//按钮按下控制输出
		if(rankbutton==1)
			putimage(100,100,&img_rank1button); 
		if(rankbutton==2)
			putimage(325,100,&img_rank2button); 
		if(rankbutton==3)
			putimage(550,100,&img_rank3button); 
		if(rankbutton==4)
			putimage(40,350,&img_rank4button);
		if(rankbutton==5)
			putimage(230,350,&img_rank5button); 
		if(rankbutton==6)
			putimage(420,350,&img_rank6button); 
		if(rankbutton==7)
			putimage(610,350,&img_rank7button); 
		putimage(rabbit_x,rabbit_y,&img_mouse);  // 鼠标直接选择关卡
	}
	if(choose==2)//开幕
	{
		clearrectangle(0,0,800,600);//清空矩形区域
		putimage(0,0,&img_open);  // 选关
	}
	//输出选关图片
	if(rank==1)//第一关	
		putimage(0,0,&img_rank1);  // 第一关
	else if(rank==2)//第二关
		putimage(0,0,&img_rank2);  // 第二关
	else if(rank==3)//第三关
		putimage(0,0,&img_rank3);  // 第三关
	else if(rank==4)//第四关
		putimage(0,0,&img_rank4);  // 第四关
	else if(rank==5)//第五关
		putimage(0,0,&img_rank5);  // 第五关
	else if(rank==6)//第六关
		putimage(0,0,&img_rank6);  // 第六关
	else if(rank==7)//第七关
		putimage(0,0,&img_rank7);  // 第七关
	else if(rank==8)
		putimage(0,0,&img_ranklast);  // 最后
	FlushBatchDraw();
}
void updateWithoutInput()      //与用户输入无关的更新 
{
    block_x=34+(50*plx);
	block_y=80+(50*ply);//方块坐标更新
}
//第一关
void rank1_startup()//第一关初始化
{	
	plx=0;
	ply=0;
	player[ply][plx]=1;//方块初始位置
    // 旗子初始位置
	flag_x=478;
	flag_y=76;
    condit[0][9]=1;//小旗落下
	condit[4][4]=5;//未按下的按钮
}
void rank1_judge()//第一关判定
{
	if(player[4][4]>=1 )
		condit[4][4]=6;//按钮按下
	else 
		condit[4][4]=5;//按钮未按下

	if(condit[4][4]==6)//按钮按下，小旗升起
		condit[0][9]=2;	
	else if(condit[4][4]==5)//按钮未按下，小旗落下
		condit[0][9]=1;
	//过关
	if((player[0][9]==1) && (condit[0][9]==2))
	{
		updateWithoutInput();
		show();
		Sleep(300);//能够使得小方块在目的地上显示并且停一段时间
		win=1;//关卡判定
		music_win();
		rank=2;//过关图片判定
	}        
}
//第二关
void rank2_startup()//第二关初始化
{
	plx=8;
	ply=8;
	block_x=34+50*plx;
	block_y=80+50*ply;
	player[ply][plx]=1;//方块初始位置
	condit[1][1]=5;//按钮位置
	for(i=0;i<2;i++)//围墙(被遮住)
		{
			condit[i][3]=7;
			condit[i][5]=7;
		}
		condit[2][3]=8;
		condit[2][4]=8;
		condit[2][5]=8;
	for(j=2;j<10;j++)//围墙（没被遮住）
			condit[6][j]=8;
}
void rank2_judge()//第二关判定
{
	if(player[1][1]>=1)//按钮按下
		condit[1][1]=6;
	else
		condit[1][1]=5;//player显示上面没有东西所以按钮没有被按下

	if(condit[1][1]==6)//按钮被按下状态
	{
		condit[0][9]=2;//小旗升起
	}
		
	else
		condit[0][9]=1;//小旗落下

	//过关
	if(condit[0][9]==2 && player[0][9]==1)
	{
		updateWithoutInput();
		show();
		Sleep(300);//能够使得小方块在目的地上显示并且停一段时间
		win=2;//关卡判定
		music_win();
		rank=3;//输入过关图片
	}
}
//第三关
void rank3_startup()//第3关初始化
{
	plx=4;
    ply=4;//小方块初始坐标
    condit[1][1]=5;//按钮1，控制左门
    condit[8][1]=5;//按钮2，控制小旗
    condit[8][8]=5;//按钮三，控制下门
    condit[1][8]=8;//一堵没被遮住的墙
    condit[0][8]=11;//左边的门，关闭
    condit[1][9]=3;//下边的门，关闭
    //小旗依旧位于[0][9]
}
void rank3_judge()//第3关判定
{
	if(player[1][1]>=1)//按钮1，控制左门
        condit[1][1]=6;
    else
        condit[1][1]=5;
    
	if(condit[1][1]==6)
        condit[0][8]=12;//左边的门打开
    else if(condit[1][1]==5)
        condit[0][8]=11;//左边的门，关闭
   
    if(player[8][1]>=1)//按钮2，控制小旗
        condit[8][1]=6;
    else
        condit[8][1]=5;
    //按钮和小旗
	if(condit[8][1]==6)//按钮按下，小旗升起
	{
		condit[0][9]=2;
	}
	    
    else if(condit[8][1]==5)//按钮未按下，小旗落下
	    condit[0][9]=1;
    
    if(player[8][8]>=1)//按钮三，控制下门
        condit[8][8]=6;
    else
        condit[8][8]=5;
    //按钮和下边门
	if(condit[8][8]==6)
        condit[1][9]=4;//下边的门打开
    else if(condit[8][8]==5)
        condit[1][9]=3;//下边的门，关闭

    if(condit[0][9]==2 && player[0][9]==1)
	{
		updateWithoutInput();
		show();
		Sleep(300);//能够使得小方块在目的地上显示并且停一段时间
        win=3;//第三关过了
		music_win();
		rank=4;
	}
}

//第四关
void rank4_startup()
{
	plx=1;
	ply=4;//小方块初始坐标
	player[ply][plx]=1;
	condit[0][4]=8;
	condit[0][6]=8;
	condit[2][4]=8;
	condit[2][6]=8;//没有被遮住的墙
	for(i=7;i<9;i++)
	{
		condit[i][4]=7;
		condit[i][6]=7;
	}
	condit[9][4]=8;
	condit[9][6]=8;//被遮住的墙壁
	
	condit[2][5]=3;
	condit[7][5]=3;// 横着的门
	condit[1][4]=11;
	condit[1][6]=11;//竖着的门
	
	
	condit[1][9]=1;//小旗
	condit[8][1]=5;//上面三个小门的按钮
	condit[8][5]=5;//小旗的按钮
	condit[1][5]=5;//下面小门的按钮
}
void rank4_judge()//第四关判定
{
	if(player[8][1]>0)//按钮按下判定
		condit[8][1]=6;
	else
		condit[8][1]=5;
	if(condit[8][1]==6)//按钮打开，上面三个小门开
	{
		condit[1][4]=12;
		condit[1][6]=12;
		condit[2][5]=4;
	}
	else//关三个小门
	{
		condit[1][4]=11;
		condit[1][6]=11;
		condit[2][5]=3;
	}

	if(player[1][5]>0)//按钮按下判定
		condit[1][5]=6;
	else
		condit[1][5]=5;
	if(condit[1][5]==6)//按钮按下，下边的门打开
		condit[7][5]=4;
	else
		condit[7][5]=3;//否则关门

	if(player[8][5]>0)//按钮按下判定
		condit[8][5]=6;
	else
		condit[8][5]=5;
	if(condit[8][5]==6)//按钮按下，小旗升起
	{
		condit[1][9]=2;
	}	
	else 
		condit[1][9]=1;
	//过关
	if(condit[1][9]==2 && player[1][9]==1)
	{
		updateWithoutInput();
		show();
		Sleep(300);//能够使得小方块在目的地上显示并且停一段时间
		win=4;//变化关卡
		music_win();
		rank=5;//输出图片
	}
}
//第五关
void rank5_startup()
{
	plx=2;
	ply=2;
	player[ply][plx]=1;//方块初始位置
	//两个按钮一起按下，小旗升起
	condit[1][1]=5;
	condit[5][1]=5;//两个按钮
	condit[4][5]=1;//小旗
	//传送阵
	condit[1][8]=9;
	condit[7][1]=9;
	for(j=4;j<7;j++)
		condit[5][j]=8;
	condit[3][5]=8;
	condit[3][6]=8;
	condit[3][4]=7;
	condit[4][4]=7;//是围墙
}
void rank5_judge()//第五关的相关判定
{
	if(player[1][1]>0)//上面有东西
		condit[1][1]=6;
	else
	    condit[1][1]=5;//按钮1号按下规定
	if(player[5][1]>0)//上面有东西
		condit[5][1]=6;
	else
		condit[5][1]=5;//按钮二号按下规定

	if(condit[1][1]==6 && condit[5][1]==6)//两个按钮都按下才过关
		condit[4][5]=2;
	else
	{
		condit[4][5]=1;//小旗升起设定
	}
	//传送设定
	if(player[1][8]==1 && judge==1)
	{
		player[1][8]=0;
		plx=1;
		ply=7;
		player[7][1]=1;
		judge=0;//judge改变，阻止重新传送回去
	}
	else if(player[7][1]==1 && judge==1)
	{
		player[7][1]=0;
		plx=8;
		ply=1;
		player[1][8]=1;
		judge=0;//judge改变，阻止重新传送回去
	}
	
	if(player[1][8]!=1 && judge==0 && player[7][1]!=1)//出了传送阵之后才能再进
		judge=1;//judge改变，阻止重新传送回去

	if(condit[4][5]==2 && player[4][5]==1)
	{
		updateWithoutInput();
		show();
		Sleep(300);//能够使得小方块在目的地上显示并且停一段时间
		win=5;
		music_win();
		rank=6;
	}
}
//第六关
void rank6_startup()//第六关总体初始化
{
	plx=2;
	ply=3;
	player[ply][plx]=1;//小方块位置初始化
	//墙壁位置初始化
	for(i=6;i<9;i=i+2)
	{
		for(j=0;j<4;j++)
			condit[i][j]=8;
	}
	for(j=2;j<8;j++)
		condit[1][j]=8;
	condit[0][2]=7;
	condit[0][7]=7;
	condit[4][8]=7;
	condit[5][8]=7;
	condit[6][8]=8;
	condit[6][9]=8;
	//小旗位置
	condit[5][9]=1;
	//按钮位置
	condit[7][5]=5;//开里面小门
	condit[7][6]=5;//开外面小门
	condit[0][3]=5;//小旗升降按钮
	//小门位置
	condit[7][2]=11;//里面小门
	condit[7][3]=11;//外面小门
	//传送位
	condit[7][0]=9;
	condit[0][6]=9;
}
void rank6_judge()//第六关判定
{
	if(player[7][5]>0)//按钮和里面的门
		condit[7][2]=12;
	else
		condit[7][2]=11;
	
	if(player[7][6]>0)//按钮和外面的门
		condit[7][3]=12;
	else
		condit[7][3]=11;

	//按钮和小旗
	if(player[0][3]>0)
		condit[5][9]=2;//小旗未升起
	else
	{
		condit[5][9]=1;//升起小旗

	}
	//传送
	if(player[7][0]==1 && judge==1)
	{
		player[7][0]=0;
		plx=6;
		ply=0;
		player[0][6]=1;
		judge=0;//judge改变，阻止重新传送回去
	}
	else if(player[0][6]==1 && judge==1)
	{
		player[0][6]=0;
		plx=0;
		ply=7;
		player[7][0]=1;
		judge=0;//judge改变，阻止重新传送回去
	}
	
	if(player[7][0]!=1 && judge==0 && player[0][6]!=1)//出了传送阵之后才能再进
		judge=1;//judge改变，可以重新传送回去

	if(condit[5][9]==2 && player[5][9]==1)
	{
		updateWithoutInput();
		show();
		Sleep(300);//能够使得小方块在目的地上显示并且停一段时间
		win=6;
		music_win();
		rank=7;
	}
}
//第7关！！！结束了啊啊啊啊阿！！！！
void rank7_startup()
{
	plx=5;
	ply=5;
	player[plx][ply]=1;//小方块初始化
	//小旗子
	condit[5][4]=1;
	//按钮
	condit[5][1]=5;
	condit[5][7]=5;
	condit[2][4]=5;
	condit[8][4]=5;
	//传送阵
	condit[8][1]=9;
	condit[2][7]=9;
}
void rank7_judge()
{
	//一堆按钮按下的判定
	if(player[5][1]>0)
		condit[5][1]=6;
	else
		condit[5][1]=5;
	
	if(player[5][7]>0)
		condit[5][7]=6;
	else
		condit[5][7]=5;
	
	if(player[2][4]>0)
		condit[2][4]=6;
	else
		condit[2][4]=5;

	if(player[8][4]>0)
		condit[8][4]=6;
	else
		condit[8][4]=5;
	//传送
	if(player[8][1]==1 && judge==1)
	{
		player[8][1]=0;
		plx=7;
		ply=2;
		player[2][7]=1;//小方块位置和判定改变
		judge=0;//judge改变，阻止重新传送回去
	}
	else if(player[2][7]==1 && judge==1)
	{
		player[2][7]=0;
		plx=1;
		ply=8;
		player[8][1]=1;
	    judge=0;//judge改变，阻止重新传送回去
	}
	if(player[8][1]!=1 && judge==0 && player[2][7]!=1)//出了传送阵之后才能再进
		judge=1;//judge改变，可以重新传送回去
	//过关
	if(condit[5][1]==6 && condit[5][7]==6 && condit[2][4]==6 && condit[8][4]==6)
        condit[5][4]=2;//四个按钮按下后小旗升起，但不代表过关
	if(key[5][1]>0 && key[5][7]>0 && key[2][4]>0 && key[8][4]>0)//要求四个按键都被放入
	{
		updateWithoutInput();
		show();
		Sleep(300);//能够使得小方块在目的地上显示并且停一段时间
		win=7;
		rank=8;
		music_win();
	}
}
void updateWithInput()     //与用户输入有关的更新，恒成立 
{
	MOUSEMSG m;//定义鼠标消息
	//获取一跳鼠标消息		
	if(MouseHit())// 这个函数用于检测当前是否有鼠标消息
	{
		m=GetMouseMsg();
		if(m.uMsg==WM_MOUSEMOVE)//鼠标移动
		{
			rabbit_x=m.x;
			rabbit_y=m.y;
			if(m.y>=100 && m.y<=250)//选关
			{
				if(m.x>=100 && m.x<=250)
					rankbutton=1;//输出按钮1
				else if(m.x>=325 && m.x<=475)
					rankbutton=2;//输出按钮2
				else if(m.x>=550 && m.x<=700)
					rankbutton=3;//输出按钮3
			}
			else if(m.y>=350 && m.y<=500)
			{
				if(m.x>=40 && m.x<=190)
					rankbutton=4;//输出按钮4
				if(m.x>=230 && m.x<=380)
					rankbutton=5;//输出按钮5
				if(m.x>=420 && m.x<=570)
					rankbutton=6;//输出按钮6
				if(m.x>=610 && m.x<=760)
					rankbutton=7;//输出按钮7
			}
		}
		else if(m.uMsg==WM_LBUTTONDOWN && choose==0)//鼠标按下左键时执行 选关
		{
			if(m.y>=100 && m.y<=250)//选关
			{
				if(m.x>=100 && m.x<=250)
				{
					win=0;
					rank=1;//输出第一关图片
				}
				else if(m.x>=325 && m.x<=475)
				{
					win=1;
					rank=2;//输出第二关图片
				}
				else if(m.x>=550 && m.x<=700)
				{
					win=2;
					rank=3;//输出第三关图片
				}					
			}
			else if(m.y>=350 && m.y<=500)
			{
				if(m.x>=40 && m.x<=190)
				{
					win=3;
					rank=4;//输出第四关图片
				}
				if(m.x>=230 && m.x<=380)
				{
					win=4;
					rank=5;//输出第五关图片
				}
				if(m.x>=420 && m.x<=570)
				{
					win=5;
					rank=6;//输出第六关图片
				}
				if(m.x>=610 && m.x<=760)
				{
					win=6;
					rank=7;//输出第七关图片
				}
			}
			choose=1; //当鼠标左键按下时不输出图片	
		}
		else if(m.uMsg==WM_LBUTTONDOWN && choose==1)//不输出选关画面
		{
			if(rank!=0 && rank!=8)
				rank=0;
			else if(rank==8)//最后一关点击任何区域退出
				exit(0);
		}
		else if(m.uMsg==WM_LBUTTONDOWN && choose==2)//输出开幕
		{
			if(m.x>=260 && m.x<=437 && m.y>=347 && m.y<=380)
				choose=0;
			if(m.x>=260 && m.x<=364 && m.y>=410 && m.y<=448)
				exit(0);
		}
	}	
	char input;//输入的消息
	if(kbhit())//键盘输入判定
	{
		input=getch();	    
		if(input==' ')
		{
			input=getch();
			if(input=='w' && returnw==1 && key[ply][plx]==0) //w
			{
				returnw=0;
				w_x=block_x-9;
				w_y=block_y-7;//w位置改变
				player[ply][plx]=3;//该处剩余小方块和按键
				key[ply][plx]=1;//该处是一个w
			}
			else if(input=='w' && returnw==0 && key[ply][plx]==1)//w
			{
				returnw=1;
				w_x=650;
				w_y=100;//w回到地图外
				player[ply][plx]=1;//该处剩余小方块
				key[ply][plx]=0;//该处无
			}
            //s
			else if(input=='s' && returns==1 && key[ply][plx]==0)
			{
				returns=0;
				s_x=block_x-9;
				s_y=block_y-7;//s位置改变
				player[ply][plx]=3;//该处剩余小方块和按键
				key[ply][plx]=2;//该处是一个s
			}
			else if(input=='s' && returns==0 && key[ply][plx]==2)
			{
				returns=1;
				s_x=650;
				s_y=200;//s回到地图外
				player[ply][plx]=1;//该处剩余小方块
				key[ply][plx]=0;//该处无
			}

            else if(input=='a' && returna==1 && key[ply][plx]==0)
			{
				returna=0;
				a_x=block_x-9;
				a_y=block_y-7;//a位置改变
				player[ply][plx]=3;//该处剩余小方块和按键
				key[ply][plx]=3;//该处是一个a
			}
			else if(input=='a' && returna==0 && key[ply][plx]==3)
			{
				returna=1;
				a_x=600;
				a_y=150;//a回到地图外
				player[ply][plx]=1;//该处剩余小方块
				key[ply][plx]=0;//该处无
			}

			else if(input=='d' && returnd==1 && key[ply][plx]==0)
			{
				returnd=0;
				d_x=block_x-9;
				d_y=block_y-7;//d位置改变
				player[ply][plx]=3;//该处剩余小方块和按键
				key[ply][plx]=4;//该处是一个d
			}
			else if(input=='d' && returnd==0 && key[ply][plx]==4)
			{
				returnd=1;
				d_x=700;
				d_y=150;//d回到地图外
				player[ply][plx]=1;//该处剩余小方块
				key[ply][plx]=0;//该处无按钮
			}
			music_buttondrop();//方向键音
		}
		else if(input=='w' && returnw==1 && ply>0 && condit[ply-1][plx]!=7 && condit[ply-1][plx]!=8 && condit[ply-1][plx]!=3 && condit[ply-1][plx]!=11 )
		{	
			if(player[ply][plx]==1)
			    player[ply][plx]=0;//原址变为空白
			else if(player[ply][plx]==3)
				player[ply][plx]=2;//原址变为按键
			ply--;//上移
			blockContiune();
			music_brickmove();//方块音效
			if(player[ply][plx]==0)//下一步地址为空白
			    player[ply][plx]=1;//变为小方块
			else if(player[ply][plx]==2)//下一步地址有按键
				player[ply][plx]=3;//变为按键和小方块
		}

		else if(input=='s' && returns==1 && ply<9 && condit[ply+1][plx]!=7 && condit[ply+1][plx]!=8 && condit[ply+1][plx]!=3  && condit[ply+1][plx]!=11)
		{
			if(player[ply][plx]==1)
			    player[ply][plx]=0;//原址变为空白
			else if(player[ply][plx]==3)
				player[ply][plx]=2;//原址变为按键
			ply++;//下移
			blockContiune();
			music_brickmove();//方块音效
			if(player[ply][plx]==0)//下一步地址为空白
			    player[ply][plx]=1;//变为小方块
			else if(player[ply][plx]==2)//下一步地址有按键
				player[ply][plx]=3;//变为按键和小方块
		}
		else if(input=='a' && returna==1 && plx>0 && condit[ply][plx-1]!=7 && condit[ply][plx-1]!=8 && condit[ply][plx-1]!=3 && condit[ply][plx-1]!=11)
		{   
			if(player[ply][plx]==1)
				player[ply][plx]=0;//原址变为空白 
			else if(player[ply][plx]==3)
				player[ply][plx]=2;//原址变为按键
			plx--;//左移
			blockContiune();
			music_brickmove();//方块音效
			if(player[ply][plx]==0)//下一步地址为空白
				player[ply][plx]=1;//变为小方块
			else if(player[ply][plx]==2)//下一步地址有按键
				player[ply][plx]=3;//变为按键和小方块
		}
		else if(input=='d' && returnd==1 && plx<9 && condit[ply][plx+1]!=7 && condit[ply][plx+1]!=8 && condit[ply][plx+1]!=3 && condit[ply][plx+1]!=11)
		{
			if(player[ply][plx]==1)
				player[ply][plx]=0;//原址变为空白
			else if(player[ply][plx]==3)
				player[ply][plx]=2;//原址变为按键}
			plx++;//右移
			blockContiune();
			music_brickmove();//方块音效
			if(player[ply][plx]==0)//下一步地址为空白
				player[ply][plx]=1;//变为小方块	    
			else if(player[ply][plx]==2)//下一步地址有按键
				player[ply][plx]=3;//变为按键和小方块
		}
		if(input=='r')//本关重开
		{
			startup();
			if(win==0)
			{
				startup();
				rank1_startup();
			}
			if(win==1)
			{
				startup();
				rank2_startup();
			}
			if(win==2)
			{
				startup();
				rank3_startup();
			}
			if(win==3)
			{
				startup();
				rank4_startup();
			}
			if(win==4)
			{
				startup();
				rank5_startup();
			}
			if(win==5)
			{
				startup();
				rank6_startup();
			}
			if(win==6)
			{
				startup();
				rank7_startup();
			}
		}
		if(input=='b')//回到选关
		{
			choose=0;
			rank=0;
			win=0;
		}		
		if(rank==8)//输入任意值退出
			exit(0);
		else if(rank!=0 && rank!=8)
			rank=0;
	}
}
void gameover()
{
	EndBatchDraw();
	getch();
	closegraph();
}
int main()
{		
	while(1)
	{
		startup();         //数据初始化	
		rank1_startup();   //1初始
		BeginBatchDraw();
		while(win==0)           //游戏循坏执行 
		{
			show();
			updateWithoutInput();  //与用户输入无关的更新 
			updateWithInput();     //与用户输入有关的更新 
			rank1_judge();         //判断
			if(win==1)            //过了第一关跳到第二关
				break;
		}
		//第2关
		startup();         //数据初始化
		rank2_startup();   //2初始
		while(win==1)
		{
			show();
			updateWithoutInput();  //与用户输入无关的更新 
			updateWithInput();     //与用户输入有关的更新 
			rank2_judge();         //判断
			if(win==2)            //过了第2关跳到第3关
				break;
		}
		//第三关
		startup();//初始化
		rank3_startup();//第三关初始化
		while(win==2)
		{
			show();
			updateWithoutInput();  //与用户输入无关的更新 
			updateWithInput();     //与用户输入有关的更新 
			rank3_judge();         //判断
			if(win==3)            //过了第2关跳到第3关
				break;
		}
		//第四关
		startup();//初始化
		rank4_startup();//第4关初始化
		while(win==3)
		{
			show();
			updateWithoutInput();  //与用户输入无关的更新 
			updateWithInput();     //与用户输入有关的更新 
			rank4_judge();         //判断
			if(win==4)            //过了第4关跳到第5关
				break;
		}
		//第五关
		startup();//初始化
		rank5_startup();//第5关初始化
		while(win==4)
		{
			show();
			updateWithoutInput();  //与用户输入无关的更新 
			updateWithInput();     //与用户输入有关的更新 
			rank5_judge();         //判断
			if(win==5)            //过了第5关跳到第6关
				break;
		}
		//第6关
		startup();//初始化
		rank6_startup();//第6关初始化
		while(win==5)
		{
			show();
			updateWithoutInput();  //与用户输入无关的更新 
			updateWithInput();     //与用户输入有关的更新 
			rank6_judge();         //判断
			if(win==6)            //过了第6关跳到第7关
				break;
		}
		//第7关
			startup();//初始化
		rank7_startup();//第7关初始化
		while(win==6)
		{
			show();
			updateWithoutInput();  //与用户输入无关的更新 
			updateWithInput();     //与用户输入有关的更新 
			rank7_judge();         //判断
			if(win==7)            //过了第7关跳到第8关
				break;
		}//1右右，2左上 3上左，4下下
		while(win==7)
		{
			show();
			updateWithoutInput();  //与用户输入无关的更新 
			updateWithInput();     //与用户输入有关的更新 
		}
		}
		gameover();
	return 0;
} 